//package com.example.hetong_system.service;
//
//import com.example.hetong_system.model.PaymentPlan;
//import com.example.hetong_system.repository.PaymentPlanRepository;
//import org.slf4j.Logger;
//import org.slf4j.LoggerFactory;
//import org.springframework.beans.factory.annotation.Autowired;
//import org.springframework.stereotype.Service;
//import org.springframework.transaction.annotation.Transactional;
//
//import java.time.LocalDateTime;
//import java.util.List;
//import java.util.Optional;
//
//@Service
//public class PaymentPlanService {
//
//    private static final Logger logger = LoggerFactory.getLogger(PaymentPlanService.class);
//
//    @Autowired
//    private PaymentPlanRepository paymentPlanRepository;
//
//    /**
//     * 更新付款计划的支付状态（使用事务保证原子性）
//     */
//    @Transactional(rollbackFor = Exception.class)
//    public void updatePaymentStatus(String outTradeNo, String alipayTradeNo, LocalDateTime payTime) {
//        // 1. 参数校验
//        if (outTradeNo == null || outTradeNo.trim().isEmpty()) {
//            throw new IllegalArgumentException("外部订单号不能为空");
//        }
//        if (alipayTradeNo == null || alipayTradeNo.trim().isEmpty()) {
//            throw new IllegalArgumentException("支付宝交易号不能为空");
//        }
//        // 支付时间为空则默认当前时间
//        LocalDateTime actualPayTime = payTime != null ? payTime : LocalDateTime.now();
//
//        // 2. 查询支付计划（使用Optional避免空指针）
//        Optional<PaymentPlan> planOptional = paymentPlanRepository.findByOutTradeNo(outTradeNo);
//        PaymentPlan plan = planOptional.orElseThrow(() ->
//                new RuntimeException("未找到对应付款计划，订单号: " + outTradeNo)
//        );
//
//        // 3. 业务校验：避免重复支付
//        if (plan.getIsExecuted()) {
//            logger.warn("付款计划已支付，无需重复处理，订单号: {}", outTradeNo);
//            return;
//        }
//
//        // 4. 执行更新（使用Repository的更新方法）
//        int rowsAffected = paymentPlanRepository.updatePaymentSuccess(
//                outTradeNo,
//                alipayTradeNo,
//                actualPayTime
//        );
//
//        // 5. 验证更新结果
//        if (rowsAffected == 0) {
//            logger.error("更新支付状态失败，未影响任何记录，订单号: {}", outTradeNo);
//            throw new RuntimeException("更新支付状态失败");
//        }
//
//        logger.info("支付状态更新成功，订单号: {}, 支付宝交易号: {}", outTradeNo, alipayTradeNo);
//    }
//
//    /**
//     * 根据合同ID查询单个支付计划（适用于一个合同对应一个计划的场景）
//     */
//    public PaymentPlan getSinglePaymentPlanByContractId(Long contractId) {
//        // 参数校验
//        if (contractId == null) {
//            throw new IllegalArgumentException("合同ID不能为空");
//        }
//
//        // 查询并处理结果（使用findFirstByContractId返回Optional）
//        Optional<PaymentPlan> planOptional = paymentPlanRepository.findFirstByContractId(contractId);
//        return planOptional.orElseThrow(() ->
//                new RuntimeException("未找到合同对应的付款计划，合同ID: " + contractId)
//        );
//    }
//
//    /**
//     * 根据合同ID查询所有支付计划（适用于一个合同对应多个计划的场景）
//     */
//    public List<PaymentPlan> getAllPaymentPlansByContractId(Long contractId) {
//        // 参数校验
//        if (contractId == null) {
//            throw new IllegalArgumentException("合同ID不能为空");
//        }
//
//        // 查询并处理结果（返回List）
//        List<PaymentPlan> plans = paymentPlanRepository.findByContractId(contractId);
//        if (plans.isEmpty()) {
//            throw new RuntimeException("未找到合同对应的付款计划，合同ID: " + contractId);
//        }
//        return plans;
//    }
//
//    /**
//     * 批量查询支付计划
//     */
//    public List<PaymentPlan> getPaymentPlansByIds(List<Long> planIds) {
//        if (planIds == null || planIds.isEmpty()) {
//            throw new IllegalArgumentException("支付计划ID列表不能为空");
//        }
//
//        List<PaymentPlan> plans = paymentPlanRepository.findByIdIn(planIds);
//        if (plans.isEmpty()) {
//            throw new RuntimeException("未找到对应的付款计划，ID列表: " + planIds);
//        }
//        return plans;
//    }
//}